package com.travel.commons.utils;

/**
 * 脱敏工具类
 *
 * @author pengrui.r@qq.com
 */
public class DesensitizeUtils {
    /**
     * 掩码脱敏
     * 从开始位到指定长度结束
     * @param data 脱敏数据
     * @param start 开始位
     * @param length 脱敏长度
     * @param mask 掩码
     */
    public static String run(String data, int start, int length, String mask) {
        return desensite(data, start - 1, data.length() - start - 1 - length, length, mask);
    }

    /**
     * 掩码脱敏
     * 从开始位到最后
     * @param data 脱敏数据
     * @param start 开始位
     * @param mask 掩码
     */
    public static String run(String data, int start, String mask) {
        return desensite(data, start - 1, 0,data.length() - start - 1, mask);
    }

    /**
     * 全脱敏
     * @param data 脱敏数据
     * @param mask 掩码
     */
    public static String run(String data, String mask) {
        return desensite(data, 0, 0, data.length(), mask);
    }

    /**
     * 开始脱敏
     * @return
     */
    private static String desensite(String data, int head, int tail, int length, String mask) {
        /* 替换匹配正则 */
        String regex = "(.{" + head + "}).*(.{" + tail + "})";
        /* 生成替换掩码 */
        StringBuilder masks = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            masks.append(mask);
        }
        String replace = "$1" + masks + "$2";
        /* 替换数据 */
        String res = data.replaceAll(regex, replace);
        if (res.length() / data.length() == 2 && res.length() % data.length() == 0) {// 全替换会出现字符串长度加倍的情况，目前不知原因，先简单处理一下
            res = res.substring(res.length() / 2);
        }
        return res;
    }
}
